home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / lists / mint / l_1599 / 1379 < prev    next >
Encoding:
Internet Message Format  |  1994-08-27  |  2.1 KB

  1. From: Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
  2. Date: Wed, 11 May 94 11:25:13 +0200
  3. Message-Id: <9405110925.AA14720@issan.informatik.uni-dortmund.de>
  4. To: mint@atari.archive.umich.edu
  5. Subject: wait4 for the MiNTlib
  6.  
  7. This is an implementation of wait4 for the MiNTlib.  Nothing special.
  8.  
  9. ------------------------- cut here -------------------------
  10. /* wait4() emulation for MiNT, by Andreas Schwab.  From wait3.c by
  11.    Eric R. Smith */
  12.  
  13. #include <types.h>
  14. #include <wait.h>
  15. #include <time.h>
  16. #include <resource.h>
  17. #include <mintbind.h>
  18. #include <errno.h>
  19. #include <signal.h>
  20.  
  21. extern int __mint;
  22.  
  23. extern long __waitval;        /* in thread.c */
  24. extern long __waittime;        /* ditto */
  25.  
  26. __EXTERN void _bzero __PROTO ((void *, unsigned long));
  27.  
  28. /* in getrusage.c */
  29. __EXTERN void _ms2tval __PROTO ((unsigned long, struct timeval *));
  30.  
  31. pid_t
  32. wait4 (pid, status, options, rusage)
  33.      pid_t pid;
  34.      union wait *status;
  35.      int options;
  36.      struct rusage *rusage;
  37. {
  38.   long r, rsc[8];
  39.   int exit_status, sig_term;
  40.  
  41.   if (__mint == 0)
  42.     {
  43.       r = __waitval;
  44.       __waitval = -ENOENT;
  45.       rsc[0] = __waittime;
  46.       rsc[1] = rsc[4] = 0;
  47.     }
  48.   else
  49.     r = Pwaitpid (pid, options, rsc);
  50.   if (r < 0)
  51.     {
  52.       errno = (int) -r;
  53.       return -1;
  54.     }
  55.   pid = (int) ((r & 0xffff0000L) >> 16);
  56.   if (pid)
  57.     {
  58.       if (status)
  59.     {
  60.       status->_i = 0;
  61.  
  62.       if ((short) r == -32)
  63.         {
  64.           sig_term = SIGINT;
  65.           exit_status = 0;
  66.         }
  67.       else
  68.         {
  69.           exit_status = (int) r & 0xff;
  70.           sig_term = ((int) r & 0x7f00) >> 8;
  71.         }
  72.       if (sig_term >= NSIG)
  73.         sig_term = 0;
  74.       if (sig_term && exit_status != 0 && exit_status != 0177)
  75.         sig_term = 0;
  76.       if (exit_status == 0177 && sig_term)
  77.         {
  78.           status->w_termsig = WSTOPPED;
  79.           status->w_stopsig = sig_term;
  80.         }
  81.       else
  82.         {
  83.           status->w_termsig = sig_term;
  84.           status->w_retcode = exit_status;
  85.         }
  86.     }
  87.       if (rusage)
  88.     {
  89.       _bzero (rusage, (unsigned long) sizeof (struct rusage));
  90.       _ms2tval (rsc[0], &rusage->ru_utime);
  91.       _ms2tval (rsc[1], &rusage->ru_stime);
  92.     }
  93.     }
  94.   return pid;
  95. }
  96. ------------------------- cut here -------------------------
  97.